﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity.Owin;
using Owin;
using CorreoSocialWeb.Models;
using Microsoft.Ajax.Utilities;
using System.Data.SqlClient;
using System.Configuration;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Net.Mail;
using System.Text.RegularExpressions;

namespace CorreoSocialWeb.Cuenta
{
    public partial class DatosPersonales : System.Web.UI.Page
    {
        protected string SuccessMessage
        {
            get;
            private set;
        }

        protected bool CanRemoveExternalLogins
        {
            get;
            private set;
        }

        private bool HasPassword(ApplicationUserManager manager)
        {
            return manager.HasPassword(User.Identity.GetUserId());
        }

        protected void ddlProvincia_SelectedIndexChanged1(object sender, EventArgs e)
        {
            try
            {
                SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
                myConnection.Open();
                SqlDataReader myReader = null;
                string strCadSQL = "SELECT par.nombre, par.id  FROM partidos par, provincias prov where par.provinciaid = prov.id AND prov.id = " + ddlProvincia.SelectedValue;
                SqlCommand myCommand = new SqlCommand(strCadSQL, myConnection);
                myReader = myCommand.ExecuteReader();
                ddlLocalidad.DataSource = myReader;
                ddlLocalidad.DataBind();
                ddlLocalidad.Items.Insert(0, new ListItem("Seleccione..."));
            }
            catch 
            {
                ErrorMessage.Text = "Ocurrio un error al cargar las provincias. ";
            }
        }


        void ddlProvincia_cargar()
        {
            SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
            myConnection.Open();
            SqlCommand myCommand = new SqlCommand("SELECT nombre, id  from provincias", myConnection);
            SqlDataReader myReader = myCommand.ExecuteReader();
            ddlProvincia.DataSource = myReader;
            ddlProvincia.DataBind();
            ddlProvincia.Items.Insert(0, new ListItem("Seleccione..."));
        }

        protected void Page_Load()
        {
            if (!IsPostBack)
            {
                ddlProvincia_cargar();


                String usu = Context.User.Identity.GetUserName();
                var usuar = new CorreoSocialDbContext().Usuarios
                     .Include("Domicilio")
                    .Include("Domicilio.Partido")
                    .Include("Domicilio.Partido.Provincia")
                    .Where(c => c.UserName.Equals(usu)).First();

                txtCorreo.Text = usuar.Email;
                txtNombre.Text = usuar.Nombre;
                txtApellido.Text = usuar.Apellido;
                txtDNI.Text = usuar.DNI.ToString();
                txtFechaNac.Text = (Convert.ToDateTime(usuar.FechaNacimiento)).ToShortDateString();
                txtDomicilio.Text = usuar.Domicilio.Direccion;
                txtPartido.Text = usuar.Domicilio.Partido.Nombre;
                txtProvincia.Text = usuar.Domicilio.Partido.Provincia.Nombre;
                txtNroCelular.Text = usuar.NroTelefonoCelular;
                txtFijo.Text = usuar.NroTelefonoFijo;





                // Determine the sections to render
                var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
                if (HasPassword(manager))
                {
                    //changePasswordHolder.Visible = true;
                }
                else
                {
                    //setPassword.Visible = true;
                    //changePasswordHolder.Visible = false;
                }
                CanRemoveExternalLogins = manager.GetLogins(User.Identity.GetUserId()).Count() > 1;

                // Render success message
                var message = Request.QueryString["m"];
                if (message != null)
                {
                    // Strip the query string from action
                    Form.Action = ResolveUrl("~/Account/Manage");

                    SuccessMessage =
                        message == "ChangePwdSuccess" ? "Your password has been changed."
                        : message == "SetPwdSuccess" ? "Your password has been set."
                        : message == "RemoveLoginSuccess" ? "The account was removed."
                        : String.Empty;
                    successMessage.Visible = !String.IsNullOrEmpty(SuccessMessage);
                }
            }
        }

        protected void ChangePassword_Click(object sender, EventArgs e)
        {
            try
            {
                lblErrorContraseña.Text = String.Empty;

                if (IsValid)
                {
                    var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
                    IdentityResult result = manager.ChangePassword(User.Identity.GetUserId(), CurrentPassword.Text, NewPassword.Text);
                    if (result.Succeeded)
                    {
                        var user = manager.FindById(User.Identity.GetUserId());
                        IdentityHelper.SignIn(manager, user, isPersistent: false);

                        lblErrorContraseña.Text = "Se cambio la contraseña correctamente.";
                        lblErrorContraseña.ForeColor = Color.Green;
                    }
                    else
                    {
                        lblErrorContraseña.ForeColor = System.Drawing.ColorTranslator.FromHtml("#b94a48");
                        lblErrorContraseña.Text = "Ocurrió un error: " + result;
                    }
                }

            }
            catch
            {
                lblErrorContraseña.ForeColor = System.Drawing.ColorTranslator.FromHtml("#b94a48");
                lblErrorContraseña.Text = "Ocurrió un error al cambiar el nuevo correo, intente mas tarde.";
            }
        }
        /*
        protected void SetPassword_Click(object sender, EventArgs e)
        {
            if (IsValid)
            {
                // Create the local login info and link the local account to the user
                var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
                IdentityResult result = manager.AddPassword(User.Identity.GetUserId(), password.Text);
                if (result.Succeeded)
                {
                    Response.Redirect("~/Account/Manage?m=SetPwdSuccess");
                }
                else
                {
                    AddErrors(result);
                }
            }
        }*/

        public IEnumerable<UserLoginInfo> GetLogins()
        {
            var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
            var accounts = manager.GetLogins(User.Identity.GetUserId());
            CanRemoveExternalLogins = accounts.Count() > 1 || HasPassword(manager);
            return accounts;
        }

        public void RemoveLogin(string loginProvider, string providerKey)
        {
            var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
            var result = manager.RemoveLogin(User.Identity.GetUserId(), new UserLoginInfo(loginProvider, providerKey));
            string msg = String.Empty;
            if (result.Succeeded)
            {
                var user = manager.FindById(User.Identity.GetUserId());
                IdentityHelper.SignIn(manager, user, isPersistent: false);
                msg = "?m=RemoveLoginSuccess";
            }
            Response.Redirect("~/Account/Manage" + msg);
        }

        private void AddErrors(IdentityResult result)
        {
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError("", error);
            }
        }

        protected void btnCambiarDireccion_Click(object sender, EventArgs e)
        {
            try
            {
                lblErrorDireccion.Text = String.Empty;

                var db = new CorreoSocialDbContext();
                String usu = Context.User.Identity.GetUserName();

                Domicilio domicilio = new Domicilio();
                domicilio.Direccion = txtNuevadireccion.Text;
                domicilio.PartidoID = Convert.ToInt32(ddlLocalidad.SelectedValue);

                var usuar = db.Usuarios.Where(c => c.UserName.Equals(usu)).First();
                usuar.DomicilioId = domicilio.Id;

                db.Domicilios.Add(domicilio);
                db.SaveChanges();

                txtDomicilio.Text = txtNuevadireccion.Text;
                txtNuevadireccion.Text = String.Empty;

                txtPartido.Text = ddlLocalidad.SelectedItem.ToString();
                ddlLocalidad.SelectedIndex = 0;

                txtProvincia.Text = ddlProvincia.SelectedItem.ToString();
                ddlProvincia.SelectedIndex = 0;

                lblErrorDireccion.Text = "Se cambio la dirección correctamente.";
                lblErrorDireccion.ForeColor = Color.Green;
            }
            catch
            {
                lblErrorDireccion.ForeColor = System.Drawing.ColorTranslator.FromHtml("#b94a48");
                lblErrorDireccion.Text = "Ocurrió un error al cambiar la dirección, intente mas tarde.";
            }
        }

        Boolean validar()
        {
            Boolean sinError = true;

            lblErrorCelular1.Text = String.Empty;
            if (txtCelular1.Text.Equals(String.Empty))
            {
                lblErrorCelular1.Text = "Ingresá número de celular.";
                sinError = false;
            }
            else
            {
                Regex regex = new Regex(@"[0-9 ]{10,20}");
                Match match = regex.Match(txtCelular1.Text);
                if (!match.Success)
                {
                    lblErrorCelular1.Text = "Debe ingresar el número de celular completo, solo números y sin guión.";
                    sinError = false;
                }
                else
                {
                    lblErrorCelular1.Text = String.Empty;
                }
            }

            lblErrorFijo.Text = String.Empty;
            if (!txtFijo.Text.Equals(String.Empty))
            {
                Regex regex = new Regex(@"[0-9 ]{10,20}");
                Match match = regex.Match(txtFijo.Text);
                if (!match.Success)
                {
                    lblErrorFijo.Text = "Debe ingresar el número fijo completo, solo números y sin guión.";
                    sinError = false;
                }
                else
                {
                    lblErrorFijo.Text = String.Empty;
                }
            }
            return sinError;
        }

        protected void btnCambiarTelefonos_Click(object sender, EventArgs e)
        {
            try
            {
                lblErrorCelular.Text = String.Empty;

                if (validar())
                {
                    var db = new CorreoSocialDbContext();
                    String usu = Context.User.Identity.GetUserName();

                    var usuar = db.Usuarios.Where(c => c.UserName.Equals(usu)).First();
                    usuar.NroTelefonoCelular = txtCelular1.Text;
                    usuar.NroTelefonoFijo = txtFijo1.Text.Equals(String.Empty) ? usuar.NroTelefonoFijo : txtFijo1.Text;

                    db.SaveChanges();

                    txtNroCelular.Text = txtCelular1.Text;
                    txtCelular1.Text = String.Empty;

                    txtFijo.Text = txtFijo1.Text;
                    txtFijo1.Text = String.Empty;

                    lblErrorCelular.Text = "Se cambio los teléfonos correctamente.";
                    lblErrorCelular.ForeColor = Color.Green;
                }
            }
            catch
            {
                lblErrorCelular.ForeColor = System.Drawing.ColorTranslator.FromHtml("#b94a48");
                lblErrorCelular.Text = "Ocurrió un error al cambiar la dirección, intente mas tarde.";
            }
        }

        protected void btnCambiarCorreo_Click(object sender, EventArgs e)
        {
            try
            {
                lblErrorCorreo.Text = String.Empty;
                lblErrorCorreo1.Text = String.Empty;

                MailAddress m = new MailAddress(Email.Text);

                var db = new CorreoSocialDbContext();
                String usu = Context.User.Identity.GetUserName();

                var usuar = db.Usuarios.Where(c => c.UserName.Equals(usu)).First();
                usuar.Email = Email.Text;
                usuar.correoConfirmado = false;
                db.SaveChanges();

                var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
                var user = manager.FindByName(usuar.NombreDeUsuario);
                string code = manager.GenerateEmailConfirmationToken(user.Id);
                int port = Request.Url.Port;
                //var websiteBase = "http://localhost";
                var websiteBase = "http://correosocial.com.ar";
                string callbackUrl = string.Format("{0}{1}{2}"
                    , websiteBase
                    , port != 80 ? ":" + port.ToString("d") : string.Empty
                    , IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id));

                EmailService s = new EmailService();
                String asunto = "Confirmá tu cuenta en CorreoSocial";
                String mensaje = "Hola, " + user.UserName + "!\n\nPara confirmar tu cuenta en CorreoSocial, ingresá al siguiente link: \n\n" + callbackUrl + "\n\n\nTe esperamos!";
                s.Enviar(user.Email, asunto, mensaje);

                txtCorreo.Text = Email.Text;
                Email.Text = String.Empty;
                Context.GetOwinContext().Authentication.SignOut();
                lblErrorCorreo.Text = "Se envió un mail con la confirmación del nuevo correo.";
                lblErrorCorreo.ForeColor = Color.Green;
            }
            catch (FormatException)
            {
                lblErrorCorreo1.ForeColor = System.Drawing.ColorTranslator.FromHtml("#b94a48");
                lblErrorCorreo1.Text = "Formato de correo no válido. Debe ingresar correo@dominio.com.";
            }
            catch
            {
                lblErrorCorreo.ForeColor = System.Drawing.ColorTranslator.FromHtml("#b94a48");
                lblErrorCorreo.Text = "Ocurrió un error al cambiar el nuevo correo, intente mas tarde.";
            }
        }

        protected void Unnamed11_Click(object sender, EventArgs e)
        {
            lblErrorContraseña.Text = String.Empty;
            CurrentPassword.Text = String.Empty;
            NewPassword.Text = String.Empty;
            ConfirmNewPassword.Text = String.Empty;
        }

        protected void Unnamed14_Click(object sender, EventArgs e)
        {
            txtCorreo.Text = String.Empty;
            txtCorreo.Text = String.Empty;
            lblcorreo.Text = String.Empty;
        }

        protected void Unnamed22_Click(object sender, EventArgs e)
        {
            lblErrorDireccion.Text = String.Empty;
            txtNuevadireccion.Text = String.Empty;
            ddlLocalidad.SelectedIndex = 0;
            ddlProvincia.SelectedIndex = 0;
        }
    }
}